/**
 * 给定01字符串S和T，长度均为N。
 * 再给定K和M，要求进行K轮操作，恰好把S变为T。
 * 每一轮操作，恰好选择M个字符进行翻转。
 * 问一共有多少种方案。
 * NMK都比较小，可以使用立方的算法
 * 注意到S和T为0和1其实并不重要，关键在于Ti与Si相同还是不同
 * 令Dij是i轮以后的字符串与S有j个相同字母的方案总数，则采用刷表法
 * Dij 对 D[i+1][j-x+(M-x)] * C(j, x) * C(N - j, M - x) 有贡献
 * 初始状态 D[0][same]=1, same表示S和T相同字母的数量，其余均为0
 * 最后 D[K][N] 为答案
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

llt const MOD = 998244353LL;
int const SZ = 101;
array<array<llt, SZ>, SZ> C{0};

void init(){
    C[0][0] = 1;
    for(int i=1;i<SZ;++i){
        C[i][0] = C[i][i] = 1;
        for(int j=1;j<i;++j) C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
    }
    return;
}

int N, K, M;
string S, T;
vector<vector<llt>> D;

llt proc(){
    int same = 0, diff = 0;
    for(int i=0;i<N;++i){
        if(S[i] == T[i]) ++same;
        else ++diff;
    }
    assert(same + diff == N);

    D.assign(K + 1, vector<llt>(N + 1, 0LL));
    D[0][same] = 1;
    for(int i=0;i<K;++i){
        const auto & di = D[i];
        auto & dd = D[i + 1];
        for(int j=0;j<=N;++j){
            const auto & dij = di[j];
            for(int k=0;k<=j;++k){
                int same = j - k + M - k;
                if(same < 0 or same > N) continue;
                if(M - k < 0 or M - k > N - j) continue;

                (dd[same] += dij * C[j][k] % MOD * C[N-j][M-k] % MOD) %= MOD;  
            }
        }
    }

    return D[K][N];
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    init();
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N >> K >> M >> S >> T;
        cout << proc() << endl;   
    }
    return 0;
}